#[macro_use]
mod macros;

mod solar;
mod lunisolar;

use std::marker::PhantomData;

pub use solar::*;
pub use lunisolar::*;

#[derive(Debug)]
pub struct Invalid<T>(PhantomData<T>);
pub type 非法<T> = Invalid<T>;

const REFERENCE: 日期 = 日期 {
    year: Year(1970),
    month: February,
    day: Day(6),
    weekday: Friday,
    干支: 庚戌,
    月: 平(正月),
    日: 初一,
};

const 參照日: 日期 = REFERENCE;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct 日期 {
    pub year: Year,
    pub month: Month,
    pub day: Day,
    pub weekday: Weekday,
    pub 干支: 干支,
    pub 月: 月,
    pub 日: 日,
}

impl 日期 {
    pub fn 年(self) -> 年 {
        self.year.into()
    }
    pub fn 年月日(self) -> 年月日 {
        年月日 {
            年: self.year.into(),
            月: self.月,
            日: self.日,
        }
    }
    pub fn date(self) -> Date {
        Date {
            year: self.year,
            month: self.month,
            day: self.day,
        }
    }
}

impl_display!(日期 = |self, f| write!(f, "{}, {}, {}", self.date(), self.weekday, self.年月日()));
